

import bpy

from 全局控制.Node.节点和插座基类 import bl_NT_Update
from 全局控制.Node.节点和插座基类 import bl_容器节点


g_顶层节点s = {}
g_可以更新的节点 = None
g_准备更新的下层节点 = None
g_当前更新节点 = None
g_更新容器节点 = None
g_当前更新节点的INDEX = 0

class C_ops_定位更新节点(bpy.types.Operator):
	bl_idname = 'node.update_node_registration_update'
	bl_label = '定位更新节点'
	#bl_options = {'REGISTER', 'UNDO'}
	
	m_节点树ID名称 = bpy.props.StringProperty(name='节点树ID名称', default='')
	m_节点ID名称 = bpy.props.StringProperty(name='节点ID名称', default='')
	
	def execute(self, context):
		node_group = bpy.data.node_groups[self.m_节点树ID名称]
		node = node_group.nodes[self.m_节点ID名称]
		#print('C_ops_定位更新节点 = ', self.m_节点树ID名称, self.m_节点ID名称, node)
		if node :
			#node.f_update()
			node.f_pushUpdate()
			bl_NT_Update.f_从顶层开始更新({node.name:node})
			#node.f_update(是否向下传递=True)
		return {'FINISHED'}



class C_ops_更新单个节点(bpy.types.Operator):
	bl_idname = 'node.update_node_single_update'
	bl_label = '更新单个节点'
	#bl_options = {'REGISTER', 'UNDO'}
	
	m_节点树ID名称 = bpy.props.StringProperty(name='节点树ID名称', default='')
	m_节点ID名称 = bpy.props.StringProperty(name='节点ID名称', default='')
	
	def execute(self, context):
		node_group = bpy.data.node_groups[self.m_节点树ID名称]
		node = node_group.nodes[self.m_节点ID名称]
		#print('C_ops_定位更新节点 = ', self.m_节点树ID名称, self.m_节点ID名称, node)
		if node :
			node.f_update()
		return {'FINISHED'}




class C_ops_单步开始更新节点(bpy.types.Operator):
	bl_idname = 'node.update_node_single_step_update_begin'
	bl_label = '单步开始更新节点'

	m_节点树ID名称 = bpy.props.StringProperty(name='节点树ID名称', default='')
	def execute(self, context):
		global g_顶层节点s
		global g_可以更新的节点

		node_group = bpy.data.node_groups[self.m_节点树ID名称]
		if node_group :
			g_顶层节点s = bl_NT_Update.f_插座顶层节点(node_group.nodes)
			bl_NT_Update.f_标记要更新的节点(g_顶层节点s)

		return {'FINISHED'}

class C_ops_执行单步更新节点(bpy.types.Operator):
	bl_idname = 'node.update_node_single_step_update'
	bl_label = '单步更新节点'

	def execute(self, context):
		global g_顶层节点s
		global g_可以更新的节点
		global g_准备更新的下层节点
		global g_当前更新节点的INDEX
		global g_当前更新节点

		if g_当前更新节点 :
			g_当前更新节点.select = False

		if (g_可以更新的节点 == None or len(g_可以更新的节点) == 0) and len(g_顶层节点s) > 0 :
			g_可以更新的节点, g_准备更新的下层节点 = bl_NT_Update.f_get需更新节点(g_顶层节点s)

		
		if g_当前更新节点的INDEX < len(g_可以更新的节点) and len(g_可以更新的节点) > 0:
			g_当前更新节点 = g_可以更新的节点[ list(g_可以更新的节点)[g_当前更新节点的INDEX] ]
			g_当前更新节点的INDEX += 1
		else:
			g_可以更新的节点 = {}
			g_顶层节点s = g_准备更新的下层节点
			g_准备更新的下层节点 = {}
			g_当前更新节点 = None
			g_当前更新节点的INDEX = 0

			if g_更新容器节点 and g_当前更新节点.node_tree:
				g_顶层节点s = bl_NT_Update.f_插座顶层节点( g_当前更新节点.node_tree.nodes )
				bl_NT_Update.f_标记要更新的节点(g_顶层节点s)
				pass

		print('g_可以更新的节点 = ', g_当前更新节点, g_可以更新的节点, g_准备更新的下层节点)
		if g_当前更新节点 :
			g_当前更新节点.select = True
			bpy.ops.node.view_selected()
			if g_当前更新节点.bl_static_type == 'GROUP' :
				g_更新容器节点 = g_当前更新节点
				
				g_栈尾更新节点 = g_当前更新节点
				super(bl_容器节点.C_SceneNode_容器, g_当前更新节点).f_update()
				pass
			else:
				bl_NT_Update.f_update节点(g_当前更新节点)
			
			
		return {'FINISHED'}

class C_ops_结束单步更新节点(bpy.types.Operator):
	bl_idname = 'node.update_node_single_step_update_close'
	bl_label = '结束单步更新节点'

	m_节点树ID名称 = bpy.props.StringProperty(name='节点树ID名称', default='')
	def execute(self, context):
		global g_顶层节点s
		global g_可以更新的节点
		global g_准备更新的下层节点
		global g_当前更新节点
		global g_当前更新节点的INDEX
		

		g_顶层节点s = {}
		g_可以更新的节点 = {}
		g_准备更新的下层节点 = {}
		g_准备更新的下层节点 = {}
		g_当前更新节点 = None
		g_当前更新节点的INDEX = 0

		return {'FINISHED'}





class NODE_PT_active_node_定位更新节点(bpy.types.Panel):
	bl_space_type = 'NODE_EDITOR'
	bl_region_type = 'UI'
	bl_label = "定位更新节点"

	@classmethod
	def poll(cls, context):
		return context.active_node is not None

	def draw(self, context):
		global g_顶层节点s
		global g_可以更新的节点
		global g_准备更新的下层节点
		global g_当前更新节点的INDEX
		global g_当前更新节点


		layout = self.layout
		node = context.active_node

		opera = layout.operator("node.update_node_registration_update")
		opera.m_节点树ID名称 = node.id_data.name
		opera.m_节点ID名称 = node.name
		
		opera = layout.operator("node.update_node_single_update")
		opera.m_节点树ID名称 = node.id_data.name
		opera.m_节点ID名称 = node.name

		
		opera = layout.operator("node.update_node_single_step_update_begin", text='开始单步:'+str(len(g_顶层节点s)))
		opera.m_节点树ID名称 = node.id_data.name
		if len(g_顶层节点s) :
			opera = layout.operator("node.update_node_single_step_update")
			opera = layout.operator("node.update_node_single_step_update_close")
		









classes = (
	C_ops_定位更新节点,
	C_ops_更新单个节点,
	NODE_PT_active_node_定位更新节点,

	C_ops_单步开始更新节点,
	C_ops_执行单步更新节点,
	C_ops_结束单步更新节点,
)




def register():
	print('NODE_PT_active_node_定位更新节点')
	for c in classes:
		bpy.utils.register_class(c)
		

def unregister():
	for c in classes:
		bpy.utils.unregister_class(c)
	

